import java.util.ArrayList;

import navalgo3.Modelo.BuscadorDeColisiones;
import navalgo3.Modelo.Destructor;
import navalgo3.Modelo.Disparo;
import navalgo3.Modelo.Lancha;
import navalgo3.Modelo.MinaDobleConRetardo;
import navalgo3.Modelo.MinaPorContacto;
import navalgo3.Modelo.MinaPuntualConRetardo;
import navalgo3.Modelo.Norte;
import navalgo3.Modelo.Posicion;
import navalgo3.Modelo.Sur;
import navalgo3.Modelo.Tablero;


import junit.framework.TestCase;


public class BuscadorDeColisionesTest extends TestCase {
	
	public void testEncuentraColisionEntreNaveYMinaPorContacto(){
		Tablero miTablero = new Tablero();
		miTablero.colocarMina(new MinaPorContacto(new Posicion(4,4)));
		ArrayList<Posicion> posicionDeLancha = new ArrayList<Posicion>();
		posicionDeLancha.add(new Posicion(4,4));
		posicionDeLancha.add(new Posicion(4,5));
		Lancha unaLancha = new Lancha(posicionDeLancha, new Norte());
		miTablero.colocarNave(unaLancha);
		BuscadorDeColisiones miBuscador = new BuscadorDeColisiones(miTablero.getMinasColisionables(), miTablero.getDisparos(), miTablero.getNaves());
		miBuscador.buscarColisionFragmentos();
		assertTrue (unaLancha.tieneDanioEn(new Posicion(4,4)));
	}
	
	public void testEncuentraColisionEntreNavesYMinasPorTiempo(){
		Tablero miTablero = new Tablero();
		miTablero.colocarMina(new MinaPuntualConRetardo(new Posicion(4,4)));
		miTablero.colocarMina(new MinaDobleConRetardo(new Posicion(5,5)));
		ArrayList<Posicion> posicionDeLancha = new ArrayList<Posicion>();
		posicionDeLancha.add(new Posicion(4,4));
		posicionDeLancha.add(new Posicion(4,5));
		Lancha unaLancha = new Lancha(posicionDeLancha, new Norte());
		ArrayList<Posicion> posicionDeDestructor = new ArrayList<Posicion>();
		posicionDeDestructor.add(new Posicion(4,5));
		posicionDeDestructor.add(new Posicion(5,5));
		posicionDeDestructor.add(new Posicion(6,5));
		Destructor unDestructor = new Destructor (posicionDeDestructor, new Sur());
		miTablero.colocarNave(unaLancha);
		miTablero.colocarNave(unDestructor);
		miTablero.disminuirTiempoAMinas();
		miTablero.disminuirTiempoAMinas();
		miTablero.disminuirTiempoAMinas();
		BuscadorDeColisiones miBuscador = new BuscadorDeColisiones(miTablero.getMinasColisionables(), miTablero.getDisparos(), miTablero.getNaves());
		miBuscador.buscarColisionFragmentos();
		assertTrue (unaLancha.estaDestruida());
		assertFalse (unDestructor.tieneDanioEn(new Posicion(4,5)));
		assertFalse (unDestructor.tieneDanioEn(new Posicion(5,5)));
		assertFalse (unDestructor.tieneDanioEn(new Posicion(6,5)));
	}
	
	public void testEncuentraColisionEntreNaveYDisparo(){
		Tablero miTablero = new Tablero();
		miTablero.colocarDisparo(new Disparo(new Posicion(4,4)));
		ArrayList<Posicion> posicionDeLancha = new ArrayList<Posicion>();
		posicionDeLancha.add(new Posicion(4,4));
		posicionDeLancha.add(new Posicion(4,5));
		Lancha unaLancha = new Lancha(posicionDeLancha, new Norte());
		miTablero.colocarNave(unaLancha);
		BuscadorDeColisiones miBuscador = new BuscadorDeColisiones(miTablero.getMinasColisionables(), miTablero.getDisparos(), miTablero.getNaves());
		miBuscador.buscarTodasLasColisiones();
		assertTrue (unaLancha.tieneDanioEn(new Posicion(4,4)));
		assertFalse (unaLancha.tieneDanioEn(new Posicion(4,5)));
	}

	public void testEncuentraColisionesEntreNaveYDisparoYminas(){
		Tablero miTablero = new Tablero();
		miTablero.colocarDisparo(new Disparo(new Posicion(4,4)));
		ArrayList<Posicion> posicionDeLancha = new ArrayList<Posicion>();
		posicionDeLancha.add(new Posicion(4,4));
		posicionDeLancha.add(new Posicion(4,5));
		Lancha unaLancha = new Lancha(posicionDeLancha, new Norte());
		miTablero.colocarNave(unaLancha);
		miTablero.colocarMina(new MinaPorContacto(new Posicion(4,5)));
		BuscadorDeColisiones miBuscador = new BuscadorDeColisiones(miTablero.getMinasColisionables(), miTablero.getDisparos(), miTablero.getNaves());
		miBuscador.buscarTodasLasColisiones();
		assertTrue(unaLancha.estaDestruida());
	}
	
}
